#include <stdlib.h>
#include <stdio.h>
#include <string.h>

//哈夫曼树可由树节点定义。
// typedef struct HuffmanTreeNode{
//     size_t weight;//权重
//     BinaryTreeNode* BinaryTreeNode;//二叉树结点域。
// }HuffmanTreeNode;

//哈夫曼树又名带权二叉树，是二叉树的一种。
//根据离散数学的比较方法，先排序，归并。再重复上述操作，直至只有一个节点。
//当然可以用优先队列。

//优先队列的操作方法很简单。
//先排序，对树节点排序。直接调用已写好的优先队列数据结构将结点指针数组改成优先队列。
//实际在C中排序对象是哈夫曼树结点指针，调用qsort，内部比较逻辑是权重。

//带权二叉树，即二叉树节点带权重。
typedef struct HuffmanTreeNode
{
    size_t weight;//权重

    //以下是二叉树结点域。
    char data;//哈夫曼树树节点域
    struct HuffmanTreeNode *left, *right;//哈夫曼树左右指针
} HuffmanTreeNode;

HuffmanTreeNode *createHuffmanTreeNode(char data, size_t weight);

HuffmanTreeNode *buildHuffmanTree(char *data, size_t freq[], int size);

void HuffmanTreeDestroy(HuffmanTreeNode *root);

void HuffmanTreePrint(HuffmanTreeNode *root);